# 取K线图中的数据
# 做成一个数组


import cv2
import numpy as np
import logging

def extract_price_coordinates(main_chart, min_white_value=200):
    """
    从K线主图中提取价格线的纵坐标（Y坐标）数组
    :param main_chart: K线主图（BGR格式，黑色背景，白色价格线）
    :param min_white_value: 白色像素的最低阈值（默认200，0-255）
    :return: 价格线坐标数组（shape: (宽度, )，每个元素是对应X的Y坐标；未找到则为-1）   返回值2 : 是否有数据,有数据, 之后的程序判断完, 就可以翻页
    """
    if main_chart is None or main_chart.size == 0:
        logging.error("提取价格坐标失败：主图为空")
        return None
    
    # 1. 转为灰度图（简化处理）
    gray = cv2.cvtColor(main_chart, cv2.COLOR_BGR2GRAY) # cv2.COLOR_BGR2GRAY
    height, width = gray.shape  # 高度（Y范围：0~height-1），宽度（X范围：0~width-1）
    
    # 2. 阈值处理：只保留白色价格线（高于阈值的像素视为价格线） # 不做二值化, 不然黄色的线会被当天白色的线
    # _, thresh = cv2.threshold(gray, min_white_value, 255, cv2.THRESH_BINARY)
    thresh = gray
    
    # 3. 逐列扫描，记录每个X对应的价格线Y坐标
    price_ys = np.full(width, height*.5, dtype=int)  # 初始化数组，-1表示未找到
    
    bool_none_data = False
    bool_none_data_part_2_number_of_none = 0 # 接下来的数值,是不是也是空的 这用于判断一些退市的股票,
    bool_none_data_part_1 = price_ys[0] == height*.5

    for x in range(width):
        # 获取当前列的所有像素（Y从0到height-1）
        column = thresh[:, x]
        
        # 找到列中白色像素的Y坐标（可能有多个，取中间值或第一个）
        white_ys = np.where(column > 240)[0]  # 返回该列所有白色像素的Y索引
        
        if len(white_ys) > 0:
            # 取中间位置作为该X对应的价格Y坐标（避免噪点影响）
            price_y = white_ys[len(white_ys) // 2]
            price_ys[x] = price_y
        elif 0 != x:
            price_ys[x] = price_ys[x-1]
            bool_none_data_part_2_number_of_none +=1
        # else: 保持-1（该X位置未找到价格线）

    # 大部分数据是空的
    bool_none_data_part_2 = bool_none_data_part_2_number_of_none > width*.5
    
    # logging.info(f"价格坐标提取完成：共{width}个时间点，有效价格点{np.sum(price_ys != -1)}个")
    # print(f" {bool_none_data_part_1 } \t {bool_none_data_part_2}")
    return price_ys , not (bool_none_data_part_1 and bool_none_data_part_2)
